【nodejs】使用nodejs获取微信小程序的openid,并授权登录

您所在的位置:网站首页 nodejs 微信 【nodejs】使用nodejs获取微信小程序的openid,并授权登录

【nodejs】使用nodejs获取微信小程序的openid,并授权登录

2023-08-12 08:24| 来源: 网络整理| 查看: 265

分成两步: ① 微信小程序的功能 ② nodejs 后台的功能

首先小程序登录功能:查看官方文档 在微信小程序端,将code,encryptedData 和 iv 的值传给node 在nodejs端,通过 https://api.weixin.qq.com/sns/jscode2session 去获取 openid 和 sessionKey。再使用 sessionKey 去解密得到用户信息,将用户信息保存进表里,完成登录过程。

步骤: ① 微信小程序的功能

代码如下:

index.wxml

立即登录

index.js

const http = require('../../../utils/request.js'); Page({ /**获取用户授权及信息 */ getUserInfo: function (e) { let that = this; if (e.detail.userInfo) { //用户按了允许授权按钮 wx.showLoading({ title: '正在登录...', }) wx.login({ success: res => { let code = res.code; //获取登录的临时凭证 if (code) { //获取授权信息 wx.getSetting({ success: function (res) { if (res.authSetting['scope.userInfo']) { //获取用户信息:getUserInfo必须是在用户已经授权的情况下调用 wx.getUserInfo({ withCredentials: true, success: res => { app.globalData.userInfo = res.userInfo //非敏感用户信息 // 发送请求,获取openid let url = " xxxxx";//后台请求地址 let params = { "code": code, "encryptedData": res.encryptedData, "iv": res.iv } http.request(url, "POST", params ).then(loginInfo => { console.log("loginInfo:", loginInfo); }) } }) } } }); } } }); } } })

request.js utils 工具类里的方法,用于网络请求

function request(url, method, params) { let apiUrl = "http://xx.xx.xx.xx:8080/"; return new Promise((resolve, reject) => { wx.request({ url: apiUrl + url, data: params, header: { 'content-type': 'application/json' }, method: method, dataType: 'json', responseType: 'text', success: function(res) { if (res.statusCode == 200) { resolve(res.data); } if (res.statusCode == 500) { wx.showToast({ title: '服务异常', }) } }, fail: function(err) { wx.hideLoading(); reject(err); }, complete: function(res) { wx.hideLoading(); }, }) }); } module.exports = { request: request }

② node.js功能 获取openid和sessionKey

let code = params.code;//获取小程序传来的code let encryptedData = params.encryptedData;//获取小程序传来的encryptedData let iv = params.iv;//获取小程序传来的iv let appid = "xxxxxxx";//自己小程序后台管理的appid,可登录小程序后台查看 let secret = "xxxxxxx";//小程序后台管理的secret,可登录小程序后台查看 let grant_type = "authorization_code";// 授权(必填)默认值 //请求获取openid let url = "https://api.weixin.qq.com/sns/jscode2session?grant_type="+grant_type+"&appid="+appid+"&secret="+secret+"&js_code="+code; let openid,sessionKey; let https = require("https"); https.get(url, (res) => { res.on('data', (d) => { console.log('返回的信息: ', JSON.parse(d)); openid = JSON.parse(d).openid;//得到openid sessionKey = JSON.parse(d).session_key;//得到session_key }).on('error', (e) => { console.error(e); }); });

下面这部分,是解密,解密后,可得到用户信息。 其实在用户授权后,也能在小程序上通过 wx.getUserInfo 方法,去获取到这些用户信息。

//下面这部分是解密 var crypto = require('crypto'); function WXBizDataCrypt(appId, sessionKey) { this.appId = appId this.sessionKey = sessionKey } WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) { // base64 decode var sessionKey = new Buffer(this.sessionKey, 'base64') encryptedData = new Buffer(encryptedData, 'base64') iv = new Buffer(iv, 'base64') try { // 解密 var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv) // 设置自动 padding 为 true,删除填充补位 decipher.setAutoPadding(true) var decoded = decipher.update(encryptedData, 'binary', 'utf8') decoded += decipher.final('utf8') decoded = JSON.parse(decoded) } catch (err) { throw new Error('Illegal Buffer') } if (decoded.watermark.appid !== this.appId) { throw new Error('Illegal Buffer') } return decoded } //解密 var pc = new WXBizDataCrypt(appid, sessionKey);//这里的sessionKey 是上面获取到的 var decodeData = pc.decryptData(encryptedData , iv);//encryptedData 是从小程序获取到的 console.log('解密后 data: ', decodeData);

完毕~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3